package com.smartfast4j.common.util;

import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.*;

import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;


/**
 * Created by cwh on 2017年9月4日 17:47:18.
 */
public class ExcelUtil {

    private static POIFSFileSystem fs;
    private static Workbook wb;
    private static Sheet sheet;
    private static Row row;

    /**
     * 读取Excel表格表头的内容
     *
     * @param
     * @return String 表头内容的数组
     */
    public static List<String> readExcelTitle(InputStream is,String name) {
        try {
            if(name.endsWith("xlsx")){
                wb = WorkbookFactory.create(is);
                is.close();
            }else{
                fs = new POIFSFileSystem(is);
                wb = new HSSFWorkbook(fs);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        sheet = wb.getSheetAt(0);
        row = sheet.getRow(0);
        // 标题总列数
        int colNum = row.getPhysicalNumberOfCells();
        List<String> list = new ArrayList<>();
        for (int i = 0; i < colNum; i++) {
            list.add(getCellFormatValue(row.getCell(i)));
        }
        return list;
    }

    /**
     * 读取Excel数据内容(包含空项)
     *
     * @param
     * @return Map 包含单元格数据内容的Map对象
     */
    public static List readExcelContentAll(InputStream is, String name) throws Exception {
        try {
            if(name.endsWith("xlsx")){
                wb = WorkbookFactory.create(is);
                is.close();
            }else{
                fs = new POIFSFileSystem(is);
                wb = new HSSFWorkbook(fs);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        sheet = wb.getSheetAt(0);
        // 得到总行数
        int rowNum = sheet.getLastRowNum();
//        row = sheet.getRow(0);
        List list = new LinkedList();
        // 正文内容应该从第二行开始,第一行为表头的标题
        for (int i = 0; i <= rowNum; i++) {
            row = sheet.getRow(i);
            //判断是不是空行，如果是，则跳过本次循环
            if(row==null){
                continue;
            }
            if (row.getCell(0) == null) {//若第一格为空，当做空行处理
                continue;
            }
            List list1 = new LinkedList();
            // 得到总行数
            int cellNum = row.getLastCellNum();
            for (int j = 0; j < cellNum; j++) {
                Cell cell = row.getCell(j);
                Object value;
                if(cell==null){
                    value = "";
                }else {
                    value = getCellFormatValue(cell).trim().replaceAll("[^\\w\\u4E00-\\u9FA5_\\?\\+\\-,'/\\\\%\\.，。@、？:\\[\\]\\{\\}\\(\\)\"]", "");
                }
                list1.add(value);
            }
            list.add(list1);
        }
        return list;
    }

    /**
     * 读取Excel数据内容
     *
     * @param
     * @return Map 包含单元格数据内容的Map对象
     */
    public static List readExcelContent(InputStream is, String name) throws Exception {
        try {
            if(name.endsWith("xlsx")){
                wb = WorkbookFactory.create(is);
                is.close();
            }else{
                fs = new POIFSFileSystem(is);
                wb = new HSSFWorkbook(fs);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        sheet = wb.getSheetAt(0);
        // 得到总行数
        int rowNum = sheet.getLastRowNum();
//        row = sheet.getRow(0);
        List list = new LinkedList();
        // 正文内容应该从第二行开始,第一行为表头的标题
        for (int i = 0; i <= rowNum; i++) {
            row = sheet.getRow(i);
            //判断是不是空行，如果是，则跳过本次循环
            if(row==null){
                continue;
            }
            if (row.getCell(0) == null) {//若第一格为空，当做空行处理
                continue;
            }
            List list1 = new LinkedList();
            // 得到总行数
            int cellNum = row.getLastCellNum();
            for (int j = 0; j < cellNum; j++) {
                Cell cell = row.getCell(j);
                if(cell==null)
                    continue;
                Object value = getCellFormatValue(cell).trim().replaceAll("[^\\w\\u4E00-\\u9FA5_\\?\\+\\-,'/\\\\%\\.，@。、？:\\[\\]\\{\\}\\(\\)\"]", "");
                list1.add(value);
            }
            list.add(list1);
        }
        return list;
    }


    /**
     * 根据HSSFCell类型设置数据
     *
     * @param cell
     * @return
     */
    private static String getCellFormatValue(Cell cell) {
        String cellvalue = "";
        if (cell != null) {
            // 判断当前Cell的Type
            switch (cell.getCellType()) {
                // 如果当前Cell的Type为NUMERIC
                case Cell.CELL_TYPE_NUMERIC:
                case Cell.CELL_TYPE_FORMULA: {
                    // 判断当前的cell是否为Date
                    if (HSSFDateUtil.isCellDateFormatted(cell)) {
                        // 如果是Date类型则，转化为Data格式

                        //方法1：这样子的data格式是带时分秒的：2011-10-12 0:00:00
                        //cellvalue = cell.getDateCellValue().toLocaleString();

                        //方法2：这样子的data格式是不带带时分秒的：2011-10-12
                        Date date = cell.getDateCellValue();
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                        cellvalue = sdf.format(date);

                    }
                    // 如果是纯数字
                    else {
                        // 取得当前Cell的数值
                        cellvalue = new BigDecimal(String.valueOf(cell.getNumericCellValue())).stripTrailingZeros().toPlainString();
                    }
                    break;
                }
                // 如果当前Cell的Type为STRIN
                case Cell.CELL_TYPE_STRING:
                    // 取得当前的Cell字符串
                    cellvalue = cell.getRichStringCellValue().getString();
                    break;
                // 默认的Cell值
                default:
                    cellvalue = " ";
            }
        } else {
            cellvalue = "";
        }
        return cellvalue;

    }



}
